package edu.nf.ch04.web;

import edu.nf.ch04.entity.User;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.format.datetime.DateFormatter;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import java.util.Arrays;

/**
 * @author wangl
 * @date 2025/5/12
 */
@Controller
//可以使用@RequestMapping标注在类上，
//用来设置请求的命名空间（区分路径前缀）
//@RequestMapping("/user")
public class UserController {

    /**
     * 使用@RequestMapping映射请求路径，
     * method属性设置可以支持的请求方法
     * 如：POST、GET等。
     * 从3.2版本开始可以使用语义更明确的映射注解
     * 如：@PostMapping、@GetMapping、@PutMapping等注解
     * 来对应不同的请求方法
     *
     * 当数据绑定时，
     * 方法参数的名和请求的参数名保持一致就可以自动映射转换
     * 但是需要注意：方法个参数名需要编译到字节码中
     * 或者使用@RequestParam注解映射请求参数
     * @return
     */
    //@RequestMapping(value = "/add", method = {RequestMethod.POST})
    @PostMapping("/add")
    public String add(@RequestParam("username") String userName,
                      @RequestParam("age") int userAge,
                      @RequestParam("phones") String[] tels) {
        System.out.println(userName);
        System.out.println(userAge);
        System.out.println(Arrays.toString(tels));
        return "index";
    }

    /**
     * 注册自定义转换器
     * 使用@InitBinder注解标注的方法会在执行当前Controller类
     * 的任意方法前先执行，通过传入的WebDataBinder参数
     * 来设置日期的格式化，这样springmvc会根据指定的日期格式
     * 来转换
     * @param binder
     */
    @InitBinder
    public void regFormatter(WebDataBinder binder) {
        binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd"));
    }

    @PostMapping("/add2")
    public String add2(User user) {
        System.out.println(user.getUsername());
        System.out.println(user.getAge());
        System.out.println(user.getBirthday());
        user.getPhones().forEach(System.out::println);
        System.out.println(user.getCard().getCardNum());
        user.getAddresses().forEach(address -> System.out.println(address.getCity() + " : " + address.getStreet()));
        return "index";
    }

    /**
     * 当请求参数是JSON字符串时，
     * 如："{
     *     "username": "user2",
     *     "age": "21",
     *     ...
     * }"
     * 必须使用来那个@RequestBody映射
     * @param user
     * @return
     */
    @PostMapping
    public String add3(@RequestBody User user) {
        System.out.println(user.getUsername());
        return "index";
    }

    /**
     * 路径参数映射
     * @param id
     * @return
     */
    @GetMapping("/user/{uid}")
    public String findUser(@PathVariable("uid") int id) {
        System.out.println(id);
        return "index";
    }
}